package com.hsylient.javase.chapter02.practice.demo02.version01;

import lombok.NonNull;
import lombok.SneakyThrows;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Extractor类的介绍
 *
 * 首先这个类中只有一个成员方法，方法的参数是是个File对象，然后io读取文件中的内容
 * 将读取到的结果放在一个字符串集合中
 * 通过预先定义好的正则表达式，去检查集合中满足条件的结果，输出
 *
 * 存在的缺点
 *
 * 如果后来的需求增加了，比如之前是提取出来QQ号，后来增加了微信号，身份证号，其实就是正则的改变
 * 如果想要代码不冗余，可以使用抽象类去解决这个问题。将正则校验的部分放在一个抽象方法中，子类去根据
 * 不同的需求去增加不同的实现，定义不同的正则规则，这样代码的改动较小
 */
public class Extractor {

    /**
     * 身份证号码提取器
     *
     * @param sourceFile 存储字符串的File文件
     * @return 正确身份证的字符串集合
     */
    @SneakyThrows
    public List<String> extract(@NonNull File sourceFile) {
        Pattern pattern = Pattern.compile("\\d{17}[\\d|x]|\\d{15}");
        Scanner scanner;
        try {
            scanner = new Scanner(sourceFile);
        } catch (FileNotFoundException e) {
            throw new FileNotFoundException(String.format("文件未找到，文件名称：%s", sourceFile.getName()));
        }
        List<String> target = new ArrayList<>();
        while (scanner.hasNext()) {
            String resource = scanner.next();
            Matcher matcher = pattern.matcher(resource);
            boolean matches = matcher.matches();
            if (matches) {
                target.add(resource);
            }
        }
        return target;
    }
}
